Remediation scripts/Restrict access to storage accounts with firewall and virtual network configurations/PowerShell/Restrict-AzSecurityStorageAccounts.ps1 (79 lines of code) (raw):
<#
.Synopsis
Add IP address Restrictions to Azure Storage Accounts
.EXAMPLE
More information: https://docs.microsoft.com/en-us/azure/storage/common/storage-network-security
Step 1. (Get-AzStorageAccountNetworkRuleSet -ResourceGroupName "myresourcegroup" -AccountName "mystorageaccount").DefaultAction
Step 2. Update-AzStorageAccountNetworkRuleSet -ResourceGroupName "myresourcegroup" -Name "mystorageaccount" -DefaultAction Deny
Step 3. (Get-AzStorageAccountNetworkRuleSet -ResourceGroupName "myresourcegroup" -AccountName "mystorageaccount").VirtualNetworkRules
Step 4. (Get-AzStorageAccountNetworkRuleSet -ResourceGroupName "myresourcegroup" -AccountName "mystorageaccount").IPRules
Step 5. Update-AzStorageAccountNetworkRuleSet -ResourceGroupName "myresourcegroup" -Name "mystorageaccount" -Bypass AzureServices,Metrics,Logging
Step 6. Add-AzStorageAccountNetworkRule -ResourceGroupName "myresourcegroup" -AccountName "mystorageaccount" -IPAddressOrRange "16.17.18.0/24"
.Requirements
Az.Resources
Az.Accounts
Az.Storage
Az.Security
.Known Issues
AzureRM Module mixed in with Az Module will break scripting due to conflict of current migration
#>
if ((Test-Path variable:SecurityTasks) -eq $true ) {
Clear-Variable SecurityTasks -Force
}
Write-Verbose "Checking for Azure module..."
$AzModule = Get-Module -Name "Az.*" -ListAvailable
if ($AzModule -eq $null) {
Write-Verbose "Azure PowerShell module not found"
#check for Admin Privleges
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if(-not ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))){
#No Admin, install to current user
Write-Warning -Message "Can not install Az Module. You are not running as Administrator"
Write-Warning -Message "Installing Az Module to Current User Scope"
Install-Module Az -Scope CurrentUser -Force
Install-Module Az.Security -Scope CurrentUser -Force
Install-Module Az.Resources -Scope CurrentUser -Force
Install-Module Az.Accounts -Scope CurrentUser -Force
Install-Module Az.Storage -Scope CurrentUser -Force
}
Else{
#Admin, install to all users
Install-Module -Name Az -AllowClobber -Force
Import-Module -Name Az.Accounts -Force
Import-Module -Name Az.Security -Force
Import-Module -Name Az.Resources -Force
Import-Module -Name Az.Storage -Force
}
}
#Login to Azure
Login-AzAccount
#Get All Subs
$Subscriptions = Get-AzSubscription
Write-Host "Collecting Subscrptions within tenant. Note: Looking through each subscrption might take some time"
#Loop Through Subs
foreach($Subscription in $Subscriptions){
$Id = ($Subscription.Id)
Select-AzSubscription $Id | Out-Null
#Get Security Task for App Services
$SecurityTasks += Get-AzSecurityTask | Where-Object {$_.RecommendationType -eq "Restrict access to storage accounts with firewall and virtual network configurations"}
}
Write-Host "Found Active 'Restrict access to storage accounts with firewall and virtual network configurations ' within your subscrptions"
foreach($SecurityTask in $SecurityTasks){
Write-Host ($SecurityTask.ResourceId)
if (-not ( ((Get-AzContext).Subscription.id) -eq ($SecurityTask.ResourceId.Split("/")[2])) ) {
Select-AzSubscription ($SecurityTask.ResourceId.Split("/")[2])
}
if (-not ((Get-AzStorageAccountNetworkRuleSet -ResourceGroupName ($SecurityTask.ResourceId.Split("/")[4]) -AccountName ($SecurityTask.ResourceId.Split("/")[8])).DefaultAction -eq $Deny) ) {
Write-Host 'Changing Storage Network to "Deny", Required Configuration Change to add IP restrctions see "https://docs.microsoft.com/en-us/azure/storage/common/storage-network-security"'
Update-AzStorageAccountNetworkRuleSet -ResourceGroupName ($SecurityTask.ResourceId.Split("/")[4]) -AccountName ($SecurityTask.ResourceId.Split("/")[8]) -DefaultAction Deny
Update-AzStorageAccountNetworkRuleSet -ResourceGroupName ($SecurityTask.ResourceId.Split("/")[4]) -Name ($SecurityTask.ResourceId.Split("/")[8]) -Bypass AzureServices,Metrics,Logging
}
Else {
Write-Host 'Rule Set is already configured for Deny - Collecting current network configuration of StorageAccount (Blank Line = Nothing configured)'
(Get-AzStorageAccountNetworkRuleSet -ResourceGroupName ($SecurityTask.ResourceId.Split("/")[4]) -AccountName ($SecurityTask.ResourceId.Split("/")[8])).VirtualNetworkRules
(Get-AzStorageAccountNetworkRuleSet -ResourceGroupName ($SecurityTask.ResourceId.Split("/")[4]) -AccountName ($SecurityTask.ResourceId.Split("/")[8])).IpRules
Update-AzStorageAccountNetworkRuleSet -ResourceGroupName ($SecurityTask.ResourceId.Split("/")[4]) -Name ($SecurityTask.ResourceId.Split("/")[8]) -Bypass AzureServices,Metrics,Logging
}
$IpAddress = Read-Host "Enter IPAddress or IPAddressRange"
Add-AzStorageAccountNetworkRule -ResourceGroupName ($SecurityTask.ResourceId.Split("/")[4]) -AccountName ($SecurityTask.ResourceId.Split("/")[8]) -IPAddressOrRange $IpAddress
}